import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;


public class AnalLex {

	int MAX;
	private String armToken[] = new String[MAX];
	private String armPalavras[] = new String[100];
	private String localTxt = new String();
	private int contPalavras = 0;
	
	
	AnalLex(String text, int max){
		localTxt = text;
		MAX = max;
	}

	public boolean verificadorLex() throws IOException{
		this.leitorSeparador();
		this.verificadorTokens();

		return true;

	}

	public void printLinha(){
		for(int i = 0; i < 20; i++){
			if(armPalavras[i] == null){
				break;
			}
			System.out.println(armPalavras[i]);
		}
	}

	// verifica se os tokens estao corretos
	private void verificadorTokens(){
		for(int i = 0; i < armPalavras.length; i++){

			if(armPalavras[i] == null){
				break;
			}
			char token[] = armPalavras[i].toCharArray();

			for(int w = 0; w < token.length; w++){
				//identifica se o token 'e um num
				if(token[0] == '0' || token[0] == '9' || token[0] == '8'|| token[0] == '7'|| token[0] == '6'|| token[0] == '5'
					|| token[0] == '4'|| token[0] == '3'|| token[0] == '2'|| token[0] == '1' || token[0] == '-' || token[0] == '+' ){
					if(armPalavras[i].contains("a") || armPalavras[i].contains("b") ||armPalavras[i].contains("c") ||armPalavras[i].contains("d") ||
							armPalavras[i].contains("e") ||armPalavras[i].contains("f") ||armPalavras[i].contains("g") ||armPalavras[i].contains("h") ||
							armPalavras[i].contains("i") ||armPalavras[i].contains("j") ||armPalavras[i].contains("l") ||armPalavras[i].contains("m") ||
							armPalavras[i].contains("n") ||armPalavras[i].contains("o") ||armPalavras[i].contains("p") ||armPalavras[i].contains("q") ||
							armPalavras[i].contains("r") ||armPalavras[i].contains("s") ||armPalavras[i].contains("t") ||armPalavras[i].contains("u") ||
							armPalavras[i].contains("v") ||armPalavras[i].contains("x") ||armPalavras[i].contains("z") ||armPalavras[i].contains("k") ||
							armPalavras[i].contains("y") ||armPalavras[i].contains("w") ||armPalavras[i].contains("{") ||armPalavras[i].contains("}") ||
							armPalavras[i].contains(")") ||armPalavras[i].contains("(") ||armPalavras[i].contains("*") ||armPalavras[i].contains("&") ||
							armPalavras[i].contains("^") ||armPalavras[i].contains("%") ||armPalavras[i].contains("$") ||armPalavras[i].contains("#") ||
							armPalavras[i].contains("@") ||armPalavras[i].contains("!") ||armPalavras[i].contains("`") ||armPalavras[i].contains("~") ||
							armPalavras[i].contains("[") ||armPalavras[i].contains("]") ||armPalavras[i].contains("|") ||armPalavras[i].contains("\\") ||
							armPalavras[i].contains(":") ||armPalavras[i].contains("\"") ||armPalavras[i].contains("?") ||armPalavras[i].contains("/") ||
							armPalavras[i].contains(">") ||armPalavras[i].contains("<") ||armPalavras[i].contains(".") ||armPalavras[i].contains(",") ||
							armPalavras[i].contains("A") || armPalavras[i].contains("B") ||armPalavras[i].contains("C") ||armPalavras[i].contains("D") ||
							armPalavras[i].contains("E") ||armPalavras[i].contains("F") ||armPalavras[i].contains("G") ||armPalavras[i].contains("H") ||
							armPalavras[i].contains("I") ||armPalavras[i].contains("J") ||armPalavras[i].contains("L") ||armPalavras[i].contains("M") ||
							armPalavras[i].contains("N") ||armPalavras[i].contains("O") ||armPalavras[i].contains("P") ||armPalavras[i].contains("Q") ||
							armPalavras[i].contains("R") ||armPalavras[i].contains("S") ||armPalavras[i].contains("T") ||armPalavras[i].contains("U") ||
							armPalavras[i].contains("V") ||armPalavras[i].contains("X") ||armPalavras[i].contains("Z") ||armPalavras[i].contains("K") ||
							armPalavras[i].contains("Y") ||armPalavras[i].contains("W")){
						System.out.println("Foi encontrado um Token invalido 0 " + armPalavras[i]);
						break;

					}
					for(int j= 1; j < token.length; j++){

						if(token[j] == '+' || token[j] == '-' ){
							System.out.println("Foi encontrado um Token invalido 1 " + armPalavras[i]);
							break;
						}

					}
				}

				//token para identificar um id
				if(token[0] == 'a' || token[0] == 'b' || token[0] == 'c'|| token[0] == 'd'|| token[0] == 'e'|| token[0] == 'f'|| token[0] == 'g' ||
						token[0] == 'h'|| token[0] == 'n' || token[0] == 's'|| token[0] == 'z'|| token[0] == 'B' || token[0] == 'G' || token[0] == 'L' ||
						token[0] == 'i'|| token[0] == 'o' || token[0] == 't'|| token[0] == 'k'|| token[0] == 'C' || token[0] == 'H' || token[0] == 'M' ||
						token[0] == 'j'|| token[0] == 'p' || token[0] == 'u'|| token[0] == 'y'|| token[0] == 'D' || token[0] == 'I' || token[0] == 'N' ||
						token[0] == 'l'|| token[0] == 'q' || token[0] == 'v'|| token[0] == 'w'|| token[0] == 'E' || token[0] == 'J' || token[0] == 'O' ||
						token[0] == 'm'|| token[0] == 'r' || token[0] == 'x'|| token[0] == 'A'|| token[0] == 'F' || token[0] == 'P' || token[0] == 'Q' ||
						token[0] == 'R'|| token[0] == 'T' || token[0] == 'V'|| token[0] == 'Z'|| token[0] == 'Y' || token[0] == 'S' || token[0] == 'U' || 
						token[0] == 'X'|| token[0] == 'W' || token[0] == 'K' ){
					if(armPalavras[i].contains("{") ||armPalavras[i].contains("}") ||armPalavras[i].contains(")") ||armPalavras[i].contains("(") ||
							armPalavras[i].contains("*") ||armPalavras[i].contains("&") ||armPalavras[i].contains(".") ||armPalavras[i].contains(",") ||
							armPalavras[i].contains("^") ||armPalavras[i].contains("%") ||armPalavras[i].contains("$") ||armPalavras[i].contains("#") ||
							armPalavras[i].contains("@") ||armPalavras[i].contains("!") ||armPalavras[i].contains("`") ||armPalavras[i].contains("~") ||
							armPalavras[i].contains("[") ||armPalavras[i].contains("]") ||armPalavras[i].contains("|") ||armPalavras[i].contains("\\")||
							armPalavras[i].contains(":") ||armPalavras[i].contains("\"")||armPalavras[i].contains("?") ||armPalavras[i].contains("/") ||
							armPalavras[i].contains(">") ||armPalavras[i].contains("1") ||armPalavras[i].contains("2") || armPalavras[i].contains("3")|| 
							armPalavras[i].contains("4") || armPalavras[i].contains("5")|| armPalavras[i].contains("6")|| armPalavras[i].contains("7")|| 
							armPalavras[i].contains("8") || armPalavras[i].contains("9")|| armPalavras[i].contains("0")){
						System.out.println("Foi encontrado um Token invalido 2 " + armPalavras[i]);
						break;
					}


				}

			}

		}


	}

	//le o txt e separa os tokens
	private void leitorSeparador() throws IOException{
		String armFrase;
		String armPalavra = "";

		File arquivo = new File(localTxt);
		FileReader leitor = new FileReader(arquivo);
		BufferedReader leitorTxt = new BufferedReader(leitor);

		//le o arquivo
		while((armFrase = leitorTxt.readLine() )!= null){

			//coloca todo o texto em uma linha
			armFrase.replace('\n', ' ');
			//armazena a linha em uma string
			char frase[] = armFrase.toCharArray();
			//separa as palavras e armazena os tokens
			for(int j = 0; j < frase.length; j++){
				//se tiver espaco em branco armazena a palavra capturada
				if(frase[j] == ' '){
					armPalavras[contPalavras] = armPalavra;
					armPalavra = "";
					contPalavras++;
				}
				//se for diferente de espaco em branco ele ira formar uma string
				if(frase[j] != ' '){
					//caso seja = ele forma a string com o ele havia juntado
					if(frase[j] == '='){
						//se o proximo passo for um outro = ele forma a string com o ele havia juntado
						//e armazena o == 
						if(frase[j+1] == '='){
							armPalavras[contPalavras] = armPalavra;
							armPalavra = "";
							contPalavras++;
							armPalavras[contPalavras] = "==";
							contPalavras++;
							j++;
						}
						// caso nao seja dois =s seguidos ele armazena a string e o = separados
						else{
							armPalavras[contPalavras] = armPalavra;
							contPalavras++;
							armPalavras[contPalavras] = "=";
							contPalavras++;
							armPalavra = "";
						}
					}
					//se for ; ele armazena a string que foi montada e depois armazena ; 
					else if(frase[j] == ';'){
						armPalavras[contPalavras] = armPalavra;
						armPalavra = "";
						contPalavras++;
						armPalavras[contPalavras] = ";";
						contPalavras++;
					}
					//caso nao seja = == ou ; ele vai vai juntando os caracteres e formando uma string
					else{
						armPalavra += frase[j];
					}
				}
				if(j == (frase.length-1)){
					armPalavras[contPalavras] = armPalavra;
					armPalavra = "";
					contPalavras++;
				}

			}
		}

	}

}
